[POWERPC] Support console=comX option for Xen console.
authorHollis Blanchard <hollisb@us.ibm.com>
Mon, 14 Aug 2006 20:22:22 +0000 (15:22 -0500)
committerHollis Blanchard <hollisb@us.ibm.com>
Mon, 14 Aug 2006 20:22:22 +0000 (15:22 -0500)
Let Xen/PPC support the console=comX option that Xen/x86 uses, so one
need simply supply CMDLINE="console=com2" on the make invocation to get
proper use of the physical serial port on a JS21.

We do this by pruning all serial devices from the device tree, and then
initializing both com1 and com2 (like arch/x86/setup.c does).

Note that `setenv direct-serial? true; nvupdate' should in theory help
with this, but it does not work at present, and will only be supported
in some future version of SLOF.  Regardless, it is useful to support the
console=comX option, since there will always be environments where it is
difficult to get access to the firmware console.

Tested on JS20 and JS21 blades.

Signed-off-by: Amos Waterland <apw@us.ibm.com>
Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>
xen/arch/powerpc/Makefile
xen/arch/powerpc/boot_of.c
xen/arch/powerpc/setup.c

index 9b54aad3cce5d9e2ac5a96c4171335517c9cb6c7..489b1686320ba3e15f32925f372f605311a020e1 100644 (file)
@@ -83,8 +83,10 @@ physdev.o: ../x86/physdev.c
 
 HDRS += $(wildcard *.h)
 
-CMDLINE = "xen"
-boot_of.o: CFLAGS += -DCMDLINE="\"$(CMDLINE)\""
+# The first token in the arguments will be silently dropped.
+IMAGENAME = xen
+CMDLINE = ""
+boot_of.o: CFLAGS += -DCMDLINE="\"$(IMAGENAME) $(CMDLINE)\""
 
 start.o: boot/start.S
        $(CC) $(CFLAGS) -D__ASSEMBLY__ -c $< -o $@
index 57465e7bc0345af253327952fb0f41e67eb1bd0e..6e552702f64016c29d7ffba296fddedab13fd187 100644 (file)
@@ -13,7 +13,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
- * Copyright (C) IBM Corp. 2005
+ * Copyright (C) IBM Corp. 2005, 2006
  *
  * Authors: Jimi Xenidis <jimix@watson.ibm.com>
  */
@@ -759,19 +759,30 @@ static int __init boot_of_serial(void *oftree)
     if (n == OF_FAILURE) {
         of_panic("instance-to-package of /chosen/stdout: failed\n");
     }
+    
+    /* Prune all serial devices from the device tree, including the
+     * one pointed to by /chosen/stdout, because a guest domain can
+     * initialize them and in so doing corrupt our console output.
+     */
+    for (p = n; p > 0; p = of_getpeer(p)) {
+        char type[32];
 
-    /* prune this from the oftree */
-    rc = of_package_to_path(n, buf, sizeof(buf));
-    if (rc == OF_FAILURE) {
-        of_panic("package-to-path of /chosen/stdout: failed\n");
-    }
-    of_printf("Pruning from devtree: %s\n"
-              "  since Xen will be using it for console\n", buf);
-    rc = ofd_prune_path(oftree, buf);
-    if (rc < 0) {
-        of_panic("prune path \"%s\" failed\n", buf);
+        rc = of_package_to_path(p, buf, sizeof(buf));
+        if (rc == OF_FAILURE)
+            of_panic("package-to-path failed\n");
+
+        rc = of_getprop(p, "device_type", type, sizeof (type));
+        if (rc == OF_FAILURE)
+            of_panic("fetching device type failed\n");
+
+        if (strcmp(type, "serial") != 0)
+            continue;
+
+        of_printf("pruning `%s' from devtree\n", buf);
+        rc = ofd_prune_path(oftree, buf);
+        if (rc < 0)
+            of_panic("prune of `%s' failed\n", buf);
     }
-    
 
     p = of_getparent(n);
     if (p == OF_FAILURE) {
@@ -798,7 +809,6 @@ static int __init boot_of_serial(void *oftree)
     if (rc == OF_FAILURE) {
         of_panic("%s: no location for serial port\n", __func__);
     }
-    ns16550.io_base = val[1];
 
     ns16550.baud = BAUD_AUTO;
     ns16550.data_bits = 8;
index 24e5f5b67ed8b8a8492b7cd70f2df88d6956b4bb..2e4bbb5e684262c612a08ac9b0cc9b283b2dfb87 100644 (file)
@@ -214,7 +214,11 @@ static void __init __start_xen(multiboot_info_t *mbi)
     if ((mbi->flags & MBI_CMDLINE) && (mbi->cmdline != 0))
         cmdline_parse(__va((ulong)mbi->cmdline));
 
+    /* We initialise the serial devices very early so we can get debugging. */
+    ns16550.io_base = 0x3f8;
     ns16550_init(0, &ns16550);
+    ns16550.io_base = 0x2f8;
+    ns16550_init(1, &ns16550);
     serial_init_preirq();
 
     init_console();